package com.example.nacos.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.exception.ExcelDataConvertException;
import com.alibaba.excel.read.listener.ReadListener;
import com.example.nacos.excelvo.RetExcel3;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;

@Slf4j
public class ReadExcelListener implements ReadListener<RetExcel3> {

    private List<RetExcel3> cachedData = new ArrayList<>(200);

    /**
     * 读出Excel文件中的数据并放入cachedData
     */
    @Override
    public void invoke(RetExcel3 easyExcelEntity, AnalysisContext analysisContext) {

        cachedData.add(easyExcelEntity);

    }

    /**
     * 所有数据解析完成了都会来调用
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        if (cachedData.size() != 0)
            handlerData();
        log.info("所有数据解析完成！");
    }

    /**
     * 在转换异常获取其他异常下会调用本接口。抛出异常则停止读取。如果这里不抛出异常则继续读取下一行
     */
    @Override
    public void onException(Exception exception, AnalysisContext context) {
        log.error("解析失败，但是继续解析下一行:{}", exception.getMessage());
        // 如果是某一个单元格的转换异常，能获取到具体行号
        // 如果要获取头的信息需配合invokeHeadMap使用
        if (exception instanceof ExcelDataConvertException ) {
            ExcelDataConvertException e = (ExcelDataConvertException)exception;
            log.error("第{}行，第{}列解析异常，数据为:{}", e.getRowIndex(), e.getColumnIndex(), e.getCellData());
        }
    }

    /**
     * 处理从Excel文件中读取的数据
     */
    public void handlerData() {
        // 处理数据代码逻辑
    }

    public List<RetExcel3> allData(){
        return cachedData;
    }

}
